package com.jinbooks.persistence.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jinbooks.entity.customer.CustomerAggregate;
import com.jinbooks.entity.customer.dto.CustomerPageDto;
import com.jinbooks.entity.customer.vo.CustomerVo;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 客户聚合信息服务类
 * 提供统一的客户信息操作接口，屏蔽底层表结构细节
 *
 * @author wuyan
 */
public interface CustomerAggregateService extends IService<CustomerAggregate> {

    /**
     * 分页查询客户列表
     *
     * @param dto 查询参数
     * @return 客户分页列表
     */
    Page<CustomerAggregate> pageList(CustomerPageDto dto);

    /**
     * 根据客户ID获取完整的客户信息
     *
     * @param customerId 客户ID
     * @param workspaceId 工作空间ID
     * @return 客户聚合信息
     * @throws Exception 如果获取客户信息失败
     */
    @Transactional(readOnly = true)
    CustomerAggregate getCustomerFullInfo(String customerId, String workspaceId);

    /**
     * 保存完整的客户信息
     *
     * @param customer 客户聚合信息
     * @return 是否保存成功
     * @throws Exception 如果保存客户信息失败
     */
    @Transactional
    boolean saveCustomerFullInfo(CustomerAggregate customer);

    /**
     * 更新完整的客户信息
     *
     * @param customer 客户聚合信息
     * @return 是否更新成功
     * @throws Exception 如果更新客户信息失败
     */
    @Transactional
    boolean updateCustomerFullInfo(CustomerAggregate customer);

    /**
     * 删除客户（逻辑删除）
     *
     * @param customerId 客户ID
     * @return 是否删除成功
     * @throws Exception 如果删除客户失败
     */
    @Transactional
    boolean deleteCustomer(String customerId);

    /**
     * 批量保存客户信息
     *
     * @param customers 客户聚合信息列表
     * @return 是否批量保存成功
     * @throws Exception 如果批量保存客户信息失败
     */
    @Transactional
    default boolean batchSaveCustomerFullInfo(List<CustomerAggregate> customers) {
        // 实现批量保存逻辑
        for (CustomerAggregate customer : customers) {
            if (!saveCustomerFullInfo(customer)) {
                return false;
            }
        }
        return true;
    }

}